// 基础路径 注意发布之前要先修改这里
//const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const CompressionWebpackPlugin = require('compression-webpack-plugin')

// 获取请求地址
const env = require('./src/config/env');
let basePath = env.basePath;

const productionGzipExtensions = ['js', 'css']
// 是否是生产环境 (生产环境默认使用 cdn 加速)
const isProduction = process.env.NODE_ENV !== 'development';
// 是否强制使用cdn (false 本地启动时不使用 | true 本地启动时也使用 cdn)
const isNeedCdn = false
// cdn 加速文件
const assetsCDN = {
    /**
     * externals对象的属性名为package.json中, 对应的库的名称（固定写法）, 属性值为引入时你自定义的名称
     */
    externals: {
        // 'vue': 'Vue',
        // 'vuex': 'Vuex',
        // 'axios': 'axios',
        // 'element-ui': 'ELEMENT',
        // 'vue-router': 'VueRouter',
        // "vue-i18n": "VueI18n",
        // // '@smallwei/avue': 'AVUE',
        // 'sortablejs': 'Sortable',
        // 'dayjs': 'dayjs',
        // 'crypto-js': 'CryptoJS',
        // 'js-cookie': 'Cookies',
        // 'nprogress': 'NProgress',
    },
    css: [
        //'https://cdn.staticfile.org/element-ui/2.15.9/theme-chalk/index.min.css',
        // 'https://unpkg.com/@smallwei/avue@2.10.10/lib/index.css',
        //'https://cdn.bootcdn.net/ajax/libs/nprogress/0.2.0/nprogress.min.css',
    ],
    js: [
        // 'https://cdn.staticfile.org/vue/2.6.14/vue.min.js',
        // 'https://cdn.bootcdn.net/ajax/libs/vuex/3.6.2/vuex.min.js',
        // 'https://cdn.staticfile.org/axios/0.27.2/axios.min.js',
        // 'https://cdn.staticfile.org/element-ui/2.15.9/index.min.js',
        // 'https://cdn.staticfile.org/vue-router/3.5.2/vue-router.min.js',
        // 'https://unpkg.com/@smallwei/avue@2.10.10/lib/avue.min.js',
        // 'https://cdn.bootcdn.net/ajax/libs/vue-i18n/8.7.0/vue-i18n.min.js',
        // 'https://cdn.bootcdn.net/ajax/libs/Sortable/1.10.0-rc2/Sortable.min.js',
        // 'https://cdn.bootcdn.net/ajax/libs/dayjs/1.10.6/dayjs.min.js',
        // 'https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/crypto-js.min.js',
        // 'https://cdn.bootcdn.net/ajax/libs/js-cookie/2.2.0/js.cookie.min.js',
        // 'https://cdn.bootcdn.net/ajax/libs/nprogress/0.2.0/nprogress.min.js',
    ]
}


module.exports = {
    //关闭eslint检查（语法检查）
    lintOnSave: true,
    productionSourceMap: false,
    devServer: {
        open: true,       // 是否自动弹出浏览器页面
        // https: false,  // 是否使用https协议
        // hotOnly: true, // 是否开启热更新
        port: 9000,
        proxy: {
            // 请求请求代理
            '/api': {
                //API服务器的地址
                target: "http://" + basePath + "/",
                ws: true,
                changeOrigin: true,
                pathRewrite: {
                    '^/api': ''
                }
            },
        },
    },
    /**
     * 首页访问优化: 排除依赖使用cdn方式引入
     * 参考： https://blog.csdn.net/weixin_43919509/article/details/124149728
     * @param config
     */
    configureWebpack: {
        // 生产环境，则添加不参与打包的包名和依赖包的名称
        externals: (isProduction || isNeedCdn) ? assetsCDN.externals : {},
        plugins: [
            // 忽略 moment.js 的所有locale文件
            // new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
            // 配置 compression-webpack-plugin 压缩
            new CompressionWebpackPlugin({
                algorithm: 'gzip',
                test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
                // 对超过10kb的文件gzip压缩
                threshold: 10240,
                minRatio: 0.8,
                // 是否删除原资源
                // deleteOriginalAssets: false
            }),
        ]
    },
    chainWebpack: (config) => {
        const entry = config.entry('app');
        entry
            .add('babel-polyfill')
            .end();
        entry
            .add('classlist-polyfill')
            .end();
        // entry
        //     .add('@/mock')
        //     .end()
        // 生产环境或需要cdn时，才注入cdn
        if (isProduction || isNeedCdn) {
            config.plugin('html').tap(args => {
                args[0].cdn = assetsCDN
                return args
            })
        }
    },
    css: {
        extract: {ignoreOrder: true}
    }
};